--- %%NOBANNER%% -->
![]() | ![]() |
/*-------------------<-- Start of Description-->---------------------\ | Generate a readme.doc file under the directory you specified; | | Note: the files must include the header using the format exactly | | like this file; | |---------------------<-- End of Description-->----------------------| |--------------------------------------------------------------------| |-----------<-- Start of Files or Arguements Needed-->---------------| | Arguments: | | directory - the complete path to the directory you want to | | create your readme.doc file for; | | stopsign - the end of the file header; | | outdata - output dataset; | | fextension - the type of files you want to create readme for; | |-----------------<-- End of Arguements Needed-->--------------------| |--------------------------------------------------------------------| |------------------<-- Start of Files Created-->---------------------| | Example: %GenReadMe(directory=T:\TACHY\BIOSTAT\Duo\Projects\ | | ACED-RID\DBget\ProgComp,outdata=dircnts); | | Usage: %GenReadMe(directory=,stopsign='-----/', outdata=, | | fextension='.sas'); | \-------------------<-- End of Files Created-->---------------------*/ %macro GenReadMe(directory=,stopsign='-----*/', outdata=, fextension='.sas'); /*---------------------------------------------\ | Author: Duo Zhou; | | Created: 10-30-2001 10:46pm; | | Purpose: Generate Readme Files under the | | directory; | \---------------------------------------------*/ /* The file assumes you have your file description listed in the file header */ /* the stopsign is the end of the file header. */ %local _tmplast_; %let _tmplast_=&syslast; %let directory=%sysfunc(dequote(&directory)); %let fextension="%sysfunc(dequote(&fextension))"; %let stopsign="%sysfunc(dequote(&stopsign))"; %let olddir=&directory; %let output=&outdata; %if (%length(%trim(%left(&directory))) >1) %then %do; %if (%quote(%substr(&directory, %length(&directory), 1)) ne %quote(\)) %then %do; %let directory=&directory.\; %end; %let ddir=%substr(&directory, 1, %eval(%length(&directory)-1)); %end; %let dirrc=%sysfunc(filename(dirrf,&directory)); %let psid=%sysfunc(DOPEN(&dirrf)); %if &psid %then %do; %let today=%sysfunc(date(),mmddyy6.); %let dirrc=%sysfunc(DCLOSE(&psid)); %let dirrc=%sysfunc(filename(dirrf)); %dir(directory=&directory, outdata=_dirtmp); proc sort data=_dirtmp; by memname; run; /* Read In the files until the stopsign */ DATA _tmp1; length fileloc myinfile $ 300 line $ 2000; set _dirtmp; by memname; line=''; if index(memname, &fextension) then do; fileloc="&directory"||trim(left(memname)); infile dummy length=linelen /*filename=myinfile line=lnum*/ end=done filevar=fileloc; do until(index(line, &stopsign) or done); input @1 line $ varying2000. linelen; output; end; end; run; /* Keep one observation per row, and concatenate the file headers */ /* into the file description.*/ data _tmp2; set _tmp1; by memname; keep memname fDesBegRow fDesEndRow fHeaderBegRow fHeaderEndRow fParaBegRow fParaEndRow fLibBegRow fLibEndrow fNeedBegRow fNeedEndrow fCreateBegRow fCreateEndrow fCommStartRow fCommEndRow; retain fDesBegRow fDesEndRow fNeedBegRow fNeedEndrow fCreateBegRow fCreateEndRow fHeaderBegRow fHeaderEndRow fParaBegRow fParaEndRow fCommStartRow fCommEndRow fLibBegRow fLibEndrow; if first.memname then do; fDesBegRow=0; fDesEndRow=0; fNeedBegRow=0; fNeedEndrow=0; fCreateBegRow=0; fCreateEndRow=0; fHeaderBegRow=0; fHeaderEndRow=0; fParaBegRow=0; fParaEndRow=0; fCommStartRow=0; fCommEndRow=0; fLibBegRow=0; fLibEndrow=0; end; if index(line, '<') and index(line, '>') and index(line, '--') and index(upcase(compbl(line)), 'START OF') and index(upcase(compbl(line)), 'HEADER') then fHeaderBegRow =_n_+1; if index(line, '<') and index(line, '>') and index(line, '--') and index(upcase(compbl(line)), 'END OF') and index(upcase(compbl(line)), 'HEADER') then fHeaderEndRow =_n_-1; if index(line, '<') and index(line, '>') and index(line, '--') and index(upcase(compbl(line)), 'START OF') and index(upcase(line), 'PARAMETER') then fParaBegRow =_n_+1; if index(line, '<') and index(line, '>') and index(line, '--') and index(upcase(compbl(line)), 'END OF') and index(upcase(line), 'PARAMETER') then fParaEndRow =_n_-1; if index(line, '<') and index(line, '>') and index(line, '--') and index(upcase(compbl(line)), 'START OF') and (index(upcase(compbl(line)), 'DESCRIPTION') OR index(upcase(compbl(line)), 'PURPOSE')) then fDesBegRow=_n_+1; if index(line, '<') and index(line, '>') and index(line, '--') and index(upcase(compbl(line)), 'END OF') and (index(upcase(compbl(line)), 'DESCRIPTION') OR index(upcase(compbl(line)), 'PURPOSE')) then fDesEndRow=_n_-1; if index(line, '<') and index(line, '>') and index(line, '--') and index(upcase(compbl(line)), 'START OF') and index(upcase(line), 'LIBRARY') then fLibBegRow=_n_+1; if index(line, '<') and index(line, '>') and index(line, '--') and index(upcase(compbl(line)), 'END OF') and index(upcase(line), 'LIBRARY') then fLibEndrow=_n_-1; if index(line, '<') and index(line, '>') and index(line, '--') and index(upcase(compbl(line)), 'START OF') and index(upcase(compbl(line)), 'NEEDED') then fNeedBegRow=_n_+1; if index(line, '<') and index(line, '>') and index(line, '--') and index(upcase(compbl(line)), 'END OF') and index(upcase(compbl(line)), 'NEEDED') then fNeedEndRow=_n_-1; if index(line, '<') and index(line, '>') and index(line, '--') and index(upcase(compbl(line)), 'START OF') and index(upcase(compbl(line)), 'CREATED') then fCreateBegRow=_n_+1; if index(line, '<') and index(line, '>') and index(line, '--') and index(upcase(compbl(line)), 'END OF') and index(upcase(compbl(line)), 'CREATED') then fCreateEndRow=_n_-1; if index(line, '<') and index(line, '>') and index(line, '--') and index(upcase(compbl(line)), 'START OF') and (index(upcase(compbl(line)), 'COMMENT') OR index(upcase(compbl(line)), 'NOTE') OR index(upcase(compbl(line)), 'EXAMPLE')) then fcommStartRow =_n_+1; if index(line, '<') and index(line, '>') and index(line, '--') and index(upcase(compbl(line)), 'END OF') and (index(upcase(compbl(line)), 'COMMENT') OR index(upcase(compbl(line)), 'NOTE') OR index(upcase(compbl(line)), 'EXAMPLE')) then fCommEndRow =_n_-1; if last.memname; run; data _tmp3; merge _tmp1 _tmp2; by memname; length fname $ 50 fHead fDes fPara fLib fNeed fCreate fComm $ 5000; retain fHead fDes fPara fLib fNeed fCreate fComm; fname=memname; if first.memname then do; fHead=''; fDes=''; fPara=''; fLib=''; fNeed=''; fCreate=''; fComm=''; end; if not index(line, '-----') and not index(line, '=====') and not index(line, '____') and not index(line, 'ŻŻŻŻ') and not index(line, '<--') and not index(line, '>--') then do; line=tranwrd(line,'/*', ' '); line=tranwrd(line, '*/', ' '); line=compress(line, '|'); line=compress(line, '*'); end; if fHeaderBegRow<=_n_ and _n_<= fHeaderEndRow then fHead=compbl(fHead)||trimn(left(line)); if fDesBegRow<=_n_ and _n_<=fDesEndRow then fDes=compbl(fDes)||trimn(left(line)); if fParaBegRow<=_n_ and _n_<= fParaEndRow then fPara=compbl(fPara)||trimn(left(line)); if fLibBegRow<=_n_ and _n_<=fLibEndRow then fLib=compbl(fLib)||trimn(left(line)); if fNeedBegRow<=_n_ and _n_<=fNeedEndRow then fNeed=compbl(fNeed)||trimn(left(line)); if fCreateBegRow<=_n_ and _n_<=fCreateEndRow then fCreate=compbl(fCreate)||trimn(left(line)); if fCommStartRow<=_n_ and _n_<=fCommEndRow then fComm=compbl(fComm)||trimn(left(line)); if last.memname; keep fname fsize fdatime fHead fDes fLib fNeed fCreate fPara fComm; label fname="File Name" fsize="File Size" fdatime="Last Modified Time" fHead="File Header" fDes="File Description" fPara="Parameter" fLib="Library" fNeed="Files or Datasets Needed" fCreate="Files Created" fComm="Comment, Reference or Usage"; run; %if (%length(&output) gt 0) %then %do; /* Output a data set as &outdata*/ data &output; set _tmp3; run; %end; /* Generate a Readme.doc file under the directory you provided*/ %let readmetoday=%sysfunc(datetime(), datetime20.); %let readmedir=&ddir.\; options orientation=landscape; ods listing close; ods html file="&ddir.\_Readme.doc"; ods path sasuser.templat(read); %let readmedir=&directory; %let readmetoday=%sysfunc(date(), mmddyy10.); data _null_; set _tmp3; file print ods = ( template='base.readme' columns=( fname=fname(generic=on) fsize=fsize(generic=on) fdatime=fdatime(generic=on) fHead=fHead(generic=on) fDes=fDes(generic=on) fPara=fPara(generic=on) fLib=fLib(generic=on) fNeed=fNeed(generic=on) fCreate=fCreate(generic=on) fComm=fComm(generic=on) ) ); put _ods_; run; /* proc print data=_tmp3 label; */ /* var fname fsize fdatime fHead fDes fLib fNeed fCreate fPara fComm; */ /* title "Readme.doc For SAS Programs Under Directory: &directory.";*/ /* run;*/ ods path sashelp.tmplmst(read); ods html close; ods listing; options orientation=portrait; proc datasets library=work nolist; delete _tmp1 _tmp2 _tmp3 _dirtmp; run;quit; %end; %else %do; %put ==> Alert! I can%str(%')t find the directory; %put ==> "&directory".; %end; %let syslast=&_tmplast_; %mend GenReadMe;